package cn.edu.lingnan.config;

import cn.edu.lingnan.bean.User;
import com.sun.istack.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *  拦截器
 * 对于管理系统或其他需要用户登录的系统，登录验证都是必不可少的环节，
 * 在SpringBoot项目中，通过拦截器来实现用户登录拦截并验证，具体登录拦截器的操作流程:
 *
 * springBoot通过实现HandlerInterceptor接口实现拦截器，通过实现WebMvcConfigurer接口实现一个配置类，
 * 在配置类总共注入拦截器，最后通过@Configureration注解注入配置
 *
 */

public class HandlerInterceptorConfig implements HandlerInterceptor {

    @Override
    //在请求处理方法之前进行调用（controller 方法调用之前调用）
    /**
     * 拦截器实现思路
     *  判断session是否存在登录对象
     *      1、如果存在返回true,放行
     *      2、如果不存在返回false,拦截，重定向
     *
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("====>之前调用");
        User user = (User) request.getSession().getAttribute("loginUser");
        if (user == null){
            request.setAttribute("msg","无权限请先登录");
            response.sendRedirect(request.getContextPath()+"/");
            return false;
        }
        return true;
    }

    @Override
    //请求处理之后进行调用，在视图被渲染之前调用
    // @Nullable  可为空 @NotNull 不可为空
    public void postHandle(HttpServletRequest request,  HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

    }

    @Override
    //在整个请求结束之后被调用，也就是在视图渲染完之后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

    }
}
